perm filename DCSTAT.MAC[NET,MRC]5 blob sn#280335 filedate 1977-05-05 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00014 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE DCSTAT  Datacomputer status
C00003 00003
C00004 00004
C00007 00005
C00009 00006
C00010 00007
C00011 00008
C00012 00009
C00015 00010
C00017 00011
C00022 00012
C00031 00013
C00036 00014
C00039 ENDMK
C⊗;
	TITLE DCSTAT  Datacomputer status

; Bugs/gripes to Bug-DFTP@MIT-AI

IF1,<
IFNDEF F.TENX,<F.TENX==0>	; NON-ZERO IF FOR TENEX OR TWENEX
IFNDEF F.ITS,<F.ITS==0>		; NON-ZERO IF FOR ITS
IFNDEF F.TP10,<F.TP10==0>	; NON-ZERO IF FOR TOPS-10
IFNDEF F.SAIL,<F.SAIL==0>	; NON-ZERO IF FOR SAIL

IFN F.TENX,<F.TENX==1
	PRINTX Assembling TENEX version>
IFN F.ITS,<F.ITS==1
	PRINTX Assembling ITS version>
IFN F.TP10,<F.TP10==1
	PRINTX Assembling TOPS-10 version>
IFN F.SAIL,<F.SAIL==1
	PRINTX Assembling SAIL version>

IFN <F.TENX+F.ITS+F.TP10+F.SAIL>-1,<
	PRINTX ? Your site specifications lose
	PASS2
	END>
>

; ***DEFINITIONS***

	DCHOST==37
	DCSOKT==703

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	REG1==1
	REG2==2
	REG3==3
	REG4==4

;	(COMMONLY USED REGISTERS)
	IOREG==R5
	BPREG==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

; MACRO DEFINITIONS

	SALL

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ	STAK,ROUTIN>

; SYSTEM DEPENDENT DEFINITIONS

; (((ITS)))
IFN F.ITS,<
	SEARCH SITS
	LOC 150

; INITIALIZATION ROUTINE; MUST DO INIT$G AFTER LOADING TO FLUSH THE
; COMPATABILITY PACKAGE COMPLETELY(AFTER PREVIOUSLY DOING A D SYSTEM
; COMMAND TO DECUUO).
INIT:	MOVSI (JUMPA)
	HRR .JBSA##	; GET DEC START ADDRESS
	.BREAK 12,[400001,,]
	SETZ 1,
	MOVE [1,,2]
	BLT .
	.BREAK 16,100000	; RETURN TO DDT

; I/O CHANNELS

	TTO==1
	ICP==2
	DCI==3

; ITS NETWORK CODES

%NSRFS==4
%NSOPN==5
%NSCLI==10
%NSINP==11

DEFINE TBOUT(REG)
<	.IOT TTO,REG>

DEFINE TSOUT(STRING)
<IRP STRING
<	MOVEI REG1,STRING
	CALLR $STRIN
>>

$STRIN:	BEGINR
	HRLI REG1,(POINT 7,)
$STRI1:	ILDB REG1
	JUMPE RETN(0)
	.IOT TTO,
	JRST $STRI1
	ENDR
DEFINE DCBIN(REG)
<	.IOT DCI,REG
	SKIPE FLAGDD
	 .IOT TTO,REG
>
>
; (((↑↑↑)))

; (((TOPS-10 OR SAIL)))
IFN F.TP10!F.SAIL,<

IFN F.SAIL,<IFNDEF TTCALL,<OPDEF TTCALL [TTYUUO]>>

	SIZBLK==200

	DCCHAN==1

; DEFINITIONS FROM "IMP.MAC"
	.IBDEV==0
	.IBSTT==1
	.IBERR==1
	.IBLCL==2
	.IBHST==3
	.IBRMT==4
	.IUSTT==0
	.IUCON==3
	.IUCLS==4
	.IULSN==5
	.IULHS==15
	.IESOF==5
	.IESKT==11
	.IEDWN==13
	.IETIM==15

DEFINE	TBOUT(REG)
<	TTCALL	1,REG>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	TTCALL	3,STRING>>

DEFINE	DCBIN(REG)
<	SKIPG	DCIBUF+2
	CALLR	NUTMI
	SOS	DCIBUF+2
	ILDB	REG,DCIBUF+1
	JUMPE REG,.-4>
>
; (((↑↑↑)))

; (((TENEX)))
IFN F.TENX,<
	SEARCH	STENEX
DEFINE	TBOUT(REG)
<	IFN	<REG1-REG>,< HRRZI	REG1,(REG)>
	PBOUT>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	HRROI	REG1,STRING
	PSOUT>>

DEFINE	DCBIN(REG)
<	MOVE	REG1,DCIJFN
	BIN
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZI	REG1,(REG2)
	PBOUT
	HRRZI	REG,(REG2)>
>
; (((↑↑↑)))

; ***PROGRAM***

DCSTAT:
IFN F.TP10!F.SAIL,<JFCL>
IFE F.ITS,<RESET>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	CALLR	S$INIT
	SKIPE	FLAGDD
	 JRST	QUIT
HEADER:	CALLR	RENPRE
	CALLR	RENLIN
	CAMN	IOREG,[ASCII/.J900/]
	 JRST	QUITQ
	CAME	IOREG,[ASCII/.I280/]
	 JRST	HEADER
	JRST	TRAILR
STATUS:	DCBIN	<IOREG>
	TBOUT	<IOREG>
	CAIE	IOREG,12
	 JRST	STATUS
TRAILR:	DCBIN	<IOREG>
	CAIE	IOREG," "
	 JRST	FINISH
	MOVEI	IOREG,"]"
	TBOUT	<IOREG>
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	JRST	STATUS
FINISH:	CALLR	RENLIN
	JRST	QUIT

; ***DATACOMPUTER INTERFACE ROUTINES***

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IOREG>
RENLNL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IOREG>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IOREG>
	CAIN	IOREG,12
	 RETURN
	CAIE	IOREG,11
	 JRST	RENLPF
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	MOVEI	IOREG,"("
RENLPP:	TBOUT	<IOREG>
	DCBIN	<IOREG>
	CAIE	IOREG,15
	 JRST	RENLPP
	DCBIN	<IOREG>
	MOVEI	IOREG,")"
	TBOUT	<IOREG>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IOREG -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BPREG,UTIL,FLAG>
RENPRP:	SETZ	IOREG,
	MOVE	BPREG,[440700,,IOREG]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIN	UTIL,15
	 JRST	RENPRL
	CAIN	UTIL,12
	 JRST	RENPRL
	IDPB	UTIL,BPREG
	SOJG	FLAG,RENPRL
	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CAIE	UTIL,"!"
	 RETURN
	CALLR	RENLIP
	JRST	RENPRP
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ/ ?? Fatal Datacomputer error ??/],CRLF>
; (((ITS)))
IFN F.ITS,<
	.BREAK 16,160000
>
; (((↑↑↑)))
; (((TOPS-10 OR SAIL)))
IFN F.SAIL!F.TP10,<
	EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
	HALTF
	JRST	.-1
>
; (((↑↑↑)))

; ***SYSTEM DEPENDENT ROUTINES***
; (((ITS)))
IFN F.ITS,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	.OPEN TTO,[.UAO,,'TTY']
	 .LOSE 1000
; ITS ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKET
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .UII!40050	; 32 BITS, GENSYM SOCKET
		MOVEI ICP
		[('NET')]
		[-1]
		MOVEI DCSOKT
		SETZI DCHOST]
	 JRST ICPLUZ
	.CALL [	SETZ
		SIXBIT/NETBLK/		; WAIT FOR STATE CHANGE
		MOVEI ICP
		MOVEI %NSRFS
		SETZM REG1]
	 .LOSE 1000
	MOVE REG1,[ICP,,RCHBLK]
	.RCHST REG1,
	HRRE REG1,RCHBLK+4
	CAIN REG1,%NSCLI
	 JRST ICPWIN
	CAIE REG1,%NSINP
	 CAIN REG1,%NSOPN
	  JRST ICPWIN
ICPLUZ:	TSOUT <[ASCIZ/The Datacomputer is dead -- lose lose!/]>
	.BREAK 16,160000
ICPWIN:	MOVE REG1,RCHBLK+1
	ADDI REG1,2
	MOVEM REG1,LCLRCV
	.IOT ICP,REG1
	.CLOSE ICP,
	ADDI REG1,1
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAI
		MOVEI DCI
		[('NET')]
		LCLRCV
		REG1
		SETZI DCHOST]
	 JRST ICPLUZ
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCI
		MOVEI %NSRFS
		SETZM REG1]
	 .LOSE 1000
	JUMPE REG1,ICPLUZ
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	DCBIN <IOREG>
	JUMPGE IOREG,QUIT
QUITQ:	.BREAK 16,160000
>
; ((↑↑↑)))

; (((TOPS-10 OR SAIL)))
IFN F.TP10!F.SAIL,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	0,[SIXBIT/DCSTAT/]
	SETNAM	0,
	CALLR	ICP
	ENDR

; (((TOPS-10)))
IFN F.TP10,<
; TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
;			2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			3) OPEN CONNECTION SOCKETS
;				A) EVEN - RECEIVE
;				B) ODD - SEND
;
ICP:	BEGINR	<IOREG,UTIL,FLAG>
ICPBEG:	SETZM	ICPBLK+.IBDEV
	SETZM	DCIBLK+.IBDEV
	SETZM	DCOBLK+.IBDEV
	SETZM	DCIBLK+.IBRMT
	SETZM	DCOBLK+.IBRMT
	MOVE	IOREG,LINP		; LISTEN ON INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	.+2
	JRST	ICPICP
	MOVE	IOREG,DCIBLK+.IBERR
	CAIE	IOREG,.IESKT
	 JRST	ICPEIL
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	LDB	REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,102
	SETZ	REG3,
	SETZ	FLAG,
ICPRDV:	MOVE	IOREG,[SIXBIT/IMP/]	; RESET DEVICE(S) USED
	MOVEM	IOREG,WRKBLK+.IBDEV
	MOVEI	REG1,(REG3)
	IDIVI	REG1,10
	JUMPE	REG1,ICPRD1
	ADDI	REG1,20
	ADDI	REG2,20
	DPB	REG1,[140600,,WRKBLK+.IBDEV]
	DPB	REG2,[060600,,WRKBLK+.IBDEV]
	JRST	ICPRD2
ICPRD1:	ADDI	REG2,20
	DPB	REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2:	SETZM	WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]	; TEST STATUS OF SOCKET
	 JRST	ICPRD3
	HRRZ	IOREG,WRKBLK+.IBHST	; FOREIGN HOST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD3
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT	; OWNING JOB
	CAIE	REG2,(REG1)
	 JRST	ICPRD3
	MOVE	IOREG,WRKBLK+.IBLCL
	CAMN	IOREG,UTIL		; DATALANGUAGE SOCKET(S)
	 JRST	ICPCLS
ICPRD3:	ADDI	REG3,1
	CAIGE	REG3,(REG4)
	 JRST	ICPRDV
	JUMPN	FLAG,ICPBEG
	TTCALL	3,[ASCIZ/ (Connections in use.)/]
	EXIT
ICPCLS:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVEI	IOREG,1
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ [Restarting]
/]
	SETO	FLAG,
	JRST	ICPRDV
ICPICP:	MOVE	IOREG,DCIBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,DCOBLK+.IBDEV	;   AND COPY IT FOR DUPLEX
	MOVEM	IOREG,DCCHAS+1
	MOVE	IOREG,LOUT		; LISTEN ON OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPEOL
	MOVE	IOREG,OICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; OPEN CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,ICPBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,ICCHAS+1
	OPEN	DCCHAN,ICCHAS		; OPEN AS STANDARD DEVICE
	 JRST	ICPEF
	IN	DCCHAN,
	 JRST	.+2
	JRST	ICPET
	MOVE	IOREG,ICPBUF+1
	MOVE	IOREG,1(IOREG)		; GET THE SOCKET NUMBER
	LSH	IOREG,-4		; RIGHT JUSTIFY 32 BITS
	MOVEM	IOREG,DCOBLK+.IBRMT
	AOJ	IOREG,
	MOVEM	IOREG,DCIBLK+.IBRMT
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,OINP		; OPEN INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	MOVE	IOREG,OOUT		; OPEN OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
	OPEN	DCCHAN,DCCHAS
	 JRST	NETECF
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT
	HRRZ	IOREG,WRKBLK+.IBHST
	ENDR
>
; (((↑↑↑)))

; ((((SAIL)))
IFN F.SAIL,<
; SAIL ICP:			THIS ROUTINE WAS SWIPED OFF OF ANOTHER
;				SAIL PROGRAM THAT WORKED; BUT I AM
;				NOT SURE HOW IT WORKS OR WHATEVER!
;				IT SURE IS A LOT MORE COMPLICATED TO
;				ICP ON A TOPS-10 THAN ITS OR TENEX!

; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

ICP:	BEGINR
	PJOB REG2,		; GET JOB #
	TIMER REG1,		; GET A "RANDOM NUMBER"
	ANDI REG1,377770	; BUT MAKE IT A HALFWORD
	MOVSS REG4,REG2		; RECEIVE SOCKET
	ADDI REG2,(REG1)	; BARFUCIOUS SAIL CROCK...
	ADDI REG4,(REG1)	; TO INSURE WE WIN OKAY...
	ADDI REG4,1		; TRANSMIT SOCKET
	INIT DCCHAN,17
	SIXBIT /IMP/
	0
	 JRST ICPLUZ
	SETZM CONECB
	MOVEM REG2,CONECB+LSLOC
	MOVEI REG3,DCHOST
	MOVEM REG3,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI REG3,40
	MOVEM REG3,CONECB+BSLOC
	MOVEI REG3,DCSOKT
	MOVEM REG3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONECB
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE REG3,FRS
	LSH REG3,-4
	MOVEM REG3,FRS
	ADDI REG3,1
	MOVEM REG3,FSS#
	ADDI REG2,2
	MOVEM REG2,LRS#
	ADDI REG4,2
	MOVEM REG4,LSS#
	MOVE REG1,CONECB+LSLOC
	MOVEM REG1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 5,24,0,12,0
		]		; TIME OUT CLS, RFNM, AND RFC
	MOVEI REG1,↑D8
	DPB REG1,[POINT 6,DCIBUF+1,11]
	DPB REG1,[POINT 6,DCOBUF+1,11]
	MOVEM REG2,CONECB+LSLOC
	MOVEI REG3,DCHOST
	MOVEM REG3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI REG3,↑D8
	MOVEM REG3,CONECB+BSLOC
	MOVE REG3,FSS
	MOVEM REG3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TRNN REG1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI REG3,↑D8
	MOVEM REG3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TRNN REG1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI REG3,4
	MOVEM REG3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TLC REG1,300000
	TLCN REG1,300000
	 TLNE REG1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TLC REG1,300000
	TLCN REG1,300000
	 TLNE REG1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	RETURN

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/? Cannot establish network connection/]
	EXIT
	ENDR
>
; (((↑↑↑)))

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT01
	SKIPN	FLAGDD
	 JRST	QUIT
	HRRZ	REG1,DCIBUF
	CALLR	NUTDD
	JRST	QUIT
QUIT01:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
QUIT02:	IFN F.TP10,<
	MOVE	IOREG,COUT		; CLOSE OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
>
QUIT03:	IFN F.TP10,<
	MOVE	IOREG,CINP		; CLOSE INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
>
QUITQ:	RESET
	EXIT

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 JRST	.+2
	JRST	NETEIT
	SKIPE	FLAGDD
	 CALLR	NUTDD
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;   IN: REG1 -- POINTER TO BUFFER HEADER
;
NUTDD:	BEGINR	<IOREG,UTIL>
	MOVE REG1,DCIBUF+1
	MOVE UTIL,DCIBUF+2
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IOREG,REG1
	JUMPE	IOREG,NUTDDL
	TTCALL	1,IOREG
	JRST	NUTDDL
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
; (((TOPS-10)))
IFN F.TP10,<
ICPERD:	TTCALL	3,[ASCIZ/ ?? Restart failure ??/]
	EXIT
ICPEIL:	TTCALL	3,[ASCIZ/ ?? Input socket listen failure ??/]
	EXIT
ICPEOL:	TTCALL	3,[ASCIZ/ ?? Output socket listen failure ??/]
	JRST	QUIT03
ICPET:	TTCALL	3,[ASCIZ/ ?? ICP failure (transfer) ??/]
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
ICPEZ:	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	JRST	QUIT02
ICPEF:	TTCALL	3,[ASCIZ/ ?? ICP failure (file control) ??/]
	JRST	ICPEZ
ICPEC:	TTCALL	3,[ASCIZ/ The Datacomputer is unavailable/]
	MOVE	0,ICPBLK+.IBERR
	CAIN	0,.IESOF	; SOCKET OPEN FAILURE
	 TTCALL	3,[ASCIZ/ (rejecting)/]
	CAIN	0,.IEDWN
	 TTCALL	3,[ASCIZ/ (down)/]
	CAIN	0,.IETIM
	 TTCALL	3,[ASCIZ/ (timeout)/]
	TTCALL	3,[ASCIZ/.
/]
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT02
	JRST	QUIT02
NETEIC:	TTCALL	3,[ASCIZ/ ?? Input failure (connection) ??/]
	EXIT
NETEOC:	TTCALL	3,[ASCIZ/ ?? Output failure (connection) ??/]
	JRST	QUIT03
NETECF:	TTCALL	3,[ASCIZ/ ?? File control failure ??/]
	JRST	QUIT02
>
; (((↑↑↑)))
NETEIT:	TTCALL	3,[ASCIZ/ ?? Input failure (transfer) ??/]
	JRST	QUIT
NETEOT:	TTCALL	3,[ASCIZ/ ?? Output failure (transfer) ??/]
	JRST	QUIT

; (((TOPS-10)))
IFN F.TP10,<
OICP:	.IUCON,,ICPBLK
CICP:	.IUCLS,,ICPBLK
LINP:	.IULSN,,DCIBLK
OINP:	.IUCON,,DCIBLK
CINP:	.IUCLS,,DCIBLK
LOUT:	.IULSN,,DCOBLK
OOUT:	.IUCON,,DCOBLK
COUT:	.IUCLS,,DCOBLK
PWRK:	.IULHS,,WRKBLK
SWRK:	.IUSTT,,WRKBLK
CWRK:	.IUCLS,,WRKBLK
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE REG1,STTBLK+1
	IOR REG1,STTBLK+2
	STATO DCCHAN,ERRBTS
	 TLNN REG1,060000
	  RETURN SKIP,1
	ENDR
>
; (((↑↑↑)))
>
; (((↑↑↑)))

; (((TENEX)))
IFN F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	REG1,[SIXBIT/DCSTAT/]
	SETNM
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[LEVTAB,,CHNTAB]
	SIR			; SET UP INTERRUPT TABLES
	EIR			; ENABLE INTERRUPTS
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[1B10+1B15] ; TTY, EOF, ILI
	AIC			; ACTIVATE CHANNELS
	SETZM	FLAGEF
	CALLR	ICP
	ENDR

; TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKETS
;				A) EVEN - INPUT
;				B) ODD - OUTPUT
; JFN STRING:	"NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP:	BEGINR
	MOVE	REG1,[440700,,BUFFER]
	HRROI	REG2,[ASCIZ/NET:20./]
	SETZ	REG3,
	SOUT			; LOCAL SOCKET 20+JOBREL
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT			; FAILURE -- MAKE HOST # INTO STRING
	 JRST	.+1		; CVHST SUCCESS OR NOUT FAILURE
	MOVN	REG2,DCSOCK
	NOUT
	 JRST	.+1
	HRLZI	REG1,1	; SHORT GTJFN
	HRROI	REG2,BUFFER
	GTJFN			; ICP CONNECTION
	 JRST	ICPEG
	MOVE	REG2,[40B5+1B19] ; 32-BIT, READ
	OPENF			; OPEN ICP CONNECTION
	 JRST	ICPEO
	BIN
	MOVEM	REG2,ICPSOC
	CLOSF
	 JRST	ICPEC
	MOVE	REG1,[440700,,BUFFER]
	HRROI	REG2,[ASCIZ/NET:22./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,BUFFER
	GTJFN			; OUTPUT JFN
	 JRST	ICPEIG
	MOVEM	REG1,DCOJFN
	HRLZI	REG1,1
	HRROI	REG2,BUFFER
	GTJFN			; INPUT JFN
	 JRST	ICPEOG
	MOVEM	REG1,DCIJFN
	MOVE	REG2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
	OPENF
	 JRST	ICPEIO
	MOVE	REG1,DCOJFN
	MOVE	REG2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	ICPEOO
	ENDR

; NETWORK QUIT
;
QUIT:	SETOM	FLAGEF
QUIT01:	DCBIN	<IOREG>
	SKIPE	FLAGEF
	 JRST	QUIT01
QUITQ:	RESET
	HALTF
	JRST	.-1		; IN CASE OF "CONTINUE"

; FATAL NETWORK ERROR MESSAGES
;
NETEQ:	PSOUT
	RESET
	HALTF
	JRST	.-1
ICPEG:	HRROI	REG1,[ASCIZ/ The datacomputer is unavailable (network)./]
	JRST	NETEQ
ICPEO:	HRROI	REG1,[ASCIZ/ The datacomputer is unavailable (down)./]
	JRST	NETEQ
ICPEC:	HRROI	REG1,[ASCIZ/ ?? ICP CLOSF failure ??/]
	JRST	NETEQ
ICPEOG:	HRROI	REG1,[ASCIZ/ ?? ICP output GTJFN failure ??/]
	JRST	NETEQ
ICPEIG:	HRROI	REG1,[ASCIZ/ ?? ICP input GTJFN failure ??/]
	JRST	NETEQ
ICPEIO:	HRROI	REG1,[ASCIZ/ ?? ICP output OPENF failure ??/]
	JRST	NETEQ
ICPEOO:	HRROI	REG1,[ASCIZ/ ?? ICP input OPENF failure ??/]
	JRST	NETEQ

; PSEUDO-INTERRUPT ROUTINES
;
EOFPSI:	SKIPN	FLAGEF
	 JRST	EOFPSE
	SETZM	FLAGEF
	DEBRK			; RETURN FROM INTERRUPT
EOFPSE:	HRROI	REG1,[ASCIZ/ ?? Unexpected EOF at /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ/ ??
/]
	PSOUT
	HALTF
	JRST	.-1
ILIPSI:	HRRZ	REG1,PSIPC1
	MOVE	REG2,-1(REG1)
	HRROI	REG1,[ASCIZ/ ?? Illegal instruction at /]
	CAMN	REG2,[-1]
	 HRROI	REG1,[ASCIZ/ ?? Impossible event at /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ/ ??
/]
	PSOUT
	HALTF
	JRST	.-1
>
; (((↑↑↑)))

; ***DATA***

	LIT			; LITERALS GO HERE

CRLF:	BYTE	(7)15,12,0,0,0

; (((ITS)))
IFN F.ITS,<
RCHBLK:	BLOCK 10
LCLRCV:	BLOCK 1
>
; (((↑↑↑)))

; (((TOPS-10)))
IFN F.TP10,<

ICPBLK:	SIXBIT	/IMP/
	0
	100			; LOCAL SOCKET
	40,,DCHOST		; 32 BIT BYTES (ICP), CCA HOST
	DCSOKT			; DATACOMPUTER SOCKET
DCIBLK:	SIXBIT	/IMP/
	0
	102			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP + 1
DCOBLK:	SIXBIT	/IMP/
	0
	103			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP
WRKBLK:	BLOCK	5
ICCHAS:	10			; IMAGE MODE
	SIXBIT	/IMP/
	0,,ICPBUF
ICPBUF:	BLOCK	3
DCCHAS:	0			; 7 BIT ASCII MODE
	SIXBIT	/IMP/
	DCOBUF,,DCIBUF
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
CONECB:	BLOCK 7
STTBLK:	2
	BLOCK 2
TERBLK:	3
	0
	1
	0
>
; (((↑↑↑)))
; (((TOPS-10 OR SAIL)))
IFN F.TP10!F.SAIL,<
DCIBUF:	BLOCK	3
DCOBUF:	BLOCK	3
>
; (((↑↑↑)))

; (((TENEX)))
IFN F.TENX,<
LEVTAB:	PSIPC1
	PSIPC2
	PSIPC3
PSIPC1:	BLOCK	1
PSIPC2:	BLOCK	1
PSIPC3:	BLOCK	1
CHNTAB:	REPEAT ↑D10,<EXP 0>
	1,,EOFPSI
	REPEAT 4,<EXP 0>
	1,,ILIPSI
	REPEAT ↑D20,<EXP 0>
FLAGEF:	0

DCSOCK:	DCSOKT
ICPSOC:	0			; ICP SOCKET
DCIJFN:	0			; DC INPUT JFN
DCOJFN:	0			; DC OUTPUT JFN
>
; (((↑↑↑)))

; * VARIABLES

FLAGDD:	0

BUFFER:	BLOCK	100

	STSIZ==100
STBEG:	BLOCK	STSIZ


	END	DCSTAT
β